package com.uniview.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;

/**
 * 
 * 日期工具类
 *
 */
public class DateUtil {

	/**完整日期格式*/
	private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	
	/**时间格式*/
	@SuppressWarnings("unused")
	private static final String TIME_FORMAT = "HH:mm:ss";

	/**日期格式*/
	private static final String DATE_FORMAT = "yyyy-MM-dd";
	
	private static Logger log = Logger.getLogger(DateUtil.class);

	/**
	 * 日期转换成字符串
	 * 
	 * @param date
	 * @return str
	 */
	public static String date2Str(Date date) {
		return new SimpleDateFormat(DATE_TIME_FORMAT).format(date);
	}

	/**
	 * 日期转换成字符串
	 * 
	 * @param date
	 * @param dateFormat
	 * @return
	 */
	public static String date2Str(Date date, String dateFormat) {
		return new SimpleDateFormat(dateFormat).format(date);
	}

	/**
	 * 字符串转换成日期
	 * 
	 * @param str
	 * @return date
	 */
	public static Date str2Date(String str) {
		try {
			return new SimpleDateFormat(DATE_TIME_FORMAT).parse(str);
		} catch (Exception er) {
			log.error("字符串转换成日期异常", er);
		}
		return null;
	}

	/**
	 * 字符串转换成日期
	 * @param str
	 * @param dateFormat
	 * @return
	 */
	public static Date str2Date(String str, String dateFormat) {
		try {
			return new SimpleDateFormat(dateFormat).parse(str);
		} catch (Exception er) {
			log.error("字符串转换成日期异常", er);
		}
		return null;
	}
	
	/**根据指定时间获取当天开始日期 时间 00:00:00，传入null为系统当天时间*/
	public static Date startOfDay(Date date){
		return str2Date(date==null?date2Str(new Date(), DATE_FORMAT)+" 00:00:00":date2Str(date, DATE_FORMAT)+" 00:00:00",DATE_TIME_FORMAT);
	}
	
	/**获取今天结束日期 时间 23:59:59*/
	public static Date endOfDay(Date date){
		return str2Date(date==null?date2Str(new Date(), DATE_FORMAT)+" 23:59:59":date2Str(date, DATE_FORMAT)+" 23:59:59",DATE_TIME_FORMAT);
	}
	
	/**获取传入时间所在的周一开始时间*/
	public static Date startOfWeek(Date date){
		Calendar cal = Calendar.getInstance();  
		if(date != null)
	     cal.setTime(date);
		else
			cal.setTime(new Date());
	     // 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了  
	     int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
	     if (1 == dayWeek) {  
	        cal.add(Calendar.DAY_OF_MONTH, -1);  
	     }  
	     // System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期  
	     // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一  
	     cal.setFirstDayOfWeek(Calendar.MONDAY);  
	     // 获得当前日期是一个星期的第几天  
	     int day = cal.get(Calendar.DAY_OF_WEEK);  
	     // 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值  
	     cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);  
	     String imptimeBegin = new SimpleDateFormat(DATE_TIME_FORMAT).format(cal.getTime());  
	     System.err.println("所在周星期一的日期：" + imptimeBegin);  
	     return startOfDay(cal.getTime());
	}
	
	/**获取传入时间所在的周日的结束时间*/
	public static Date endOfWeek(Date date){
		Calendar cal = Calendar.getInstance();  
		if(date != null)
			cal.setTime(date);
		else
			cal.setTime(new Date());
		// 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了  
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天  
		if (1 == dayWeek) {  
			cal.add(Calendar.DAY_OF_MONTH, -1);  
		}  
		// System.out.println("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期  
		// 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一  
		cal.setFirstDayOfWeek(Calendar.MONDAY);  
		// 获得当前日期是一个星期的第几天  
		int day = cal.get(Calendar.DAY_OF_WEEK);  
		// 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值  
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);  
		cal.add(Calendar.DATE, 6);  
		String imptimeEnd = new SimpleDateFormat(DATE_TIME_FORMAT).format(cal.getTime());  
		
		System.err.println("所在周星期日的日期：" + imptimeEnd); 
		return endOfDay(cal.getTime());
	}
	
	/**获取传入时间所在的月份的开始日期  e.g. 2017-02-01 00:00:00 传入null表示今天*/
	public static Date startOfMonth(Date date){
		if(date == null) date = new Date();
		SimpleDateFormat monthFm = new SimpleDateFormat("yyyy-MM-01 00:00:00");
		return str2Date(monthFm.format(date));
	}
	
	/**获取传入时间所在的月份的结束日期  e.g. 2017-02-28 23:59:59 传入null表示今天*/
	public static Date endOfMonth(Date date){
		Calendar cal = Calendar.getInstance();  
		if(date != null)
			cal.setTime(date);
		else
			cal.setTime(new Date());
		// 获取当月最大号数
		int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		cal.set(Calendar.DATE, day);
		cal.set(Calendar.HOUR, 23);
		cal.set(Calendar.MINUTE,59);
		cal.set(Calendar.SECOND, 59);
		
		System.err.println("这个月的结束时间："+date2Str(cal.getTime()));
		return cal.getTime();
	}
	
	/**获取传入时间所在的年份的开始日期  e.g. 2017-02-01 00:00:00 传入null表示今年*/
	public static Date startOfYear(Date date){
		if(date == null) date = new Date();
		SimpleDateFormat yearFm = new SimpleDateFormat("yyyy-01-01 00:00:00");
		return str2Date(yearFm.format(date));
	}
	
	/**获取传入时间所在的年份的结束日期  e.g. 2017-02-28 23:59:59 传入null表示今年*/
	public static Date endOfYear(Date date){
		SimpleDateFormat yearFm = new SimpleDateFormat("yyyy-12-31 23:59:59");
		if(date == null) date = new Date();
		System.err.println("这个年份的结束时间："+yearFm.format(date));
		return str2Date((yearFm.format(date)));
	}

	/**	计算与今天相差的天数	*/
	public static int betweenDayOfNow(String str){
		return betweenDayOfNow(str2Date(str,DATE_FORMAT));
	}
	
	/**	计算与今天相差的天数	*/
	public static int betweenDayOfNow(Date start){
		Date end = new Date();
		long between = end.getTime() - start.getTime();
		return (int) (between/(1000 * 24 * 60 * 60));
	}
	
	// 计算两个日期时间相差的小时数
	public static Float getHoursBetwee2Date(Date begin, Date end) {
		Long beginTime = begin.getTime();
		Long endTime = end.getTime();
		Long timeAbs = endTime - beginTime;
		float hours = timeAbs.floatValue() /(1000.00f * 60.00f * 60.00f);
		return hours;
	}
}
